package com.tests;

import com.metier.*;

import java.util.ArrayList;
import java.util.List;

import static org.junit.Assert.*;

import org.junit.After;
import org.junit.Before;
import org.junit.Test;

/**
 * Classe de test de la Classe metier Station
 * 
 * @author b0dian
 * @version 1.0
 *
 */
public class StationTest {
	Station s;
	Station s1;
	Borne b1;
	Borne b2;
	Borne b3;
	Borne b4;
	TypeCharge t1;
	TypeCharge t2;
	TypeCharge t3;

	/**
	 * Nos test necessiterons des objets qui sont instancie ici
	 */
	@Before
	public void setUp() throws Exception {
		t1 = new TypeCharge(1, "fast", 65);
		t2 = new TypeCharge(2, "lente", 3);
		t3 = new TypeCharge(3, "moyenne", 25);
		s = new Station(1, "Gare du nord");
		s1 = new Station(2, "Gare de l'est");

		b1 = new Borne(1, "26/09/1993", 1, t1);
		b2 = new Borne(2, "28/02/2000", 2, t2);
		b3 = new Borne(3, "14/07/2002", 2, t2);
		b4 = new Borne(4, "16/02/2013", 3, t3);
		s.ajoutBorne(b1);
		s.ajoutBorne(b2);
		s.ajoutBorne(b3);
		s.ajoutBorne(b4);
		s1.ajoutBorne(b2);
		s1.ajoutBorne(b3);
		s1.ajoutBorne(b4);
	}

	/**
	 * Les objets instancie precedemment doivent ètre detruit
	 * 
	 * @throws Exception
	 */
	@After
	public void tearDown() throws Exception {
		t1 = null;
		t2 = null;
		t3 = null;
		s = null;
		s1 = null;
		b1 = null;
		b2 = null;
		b3 = null;
		b4 = null;
	}

	/**
	 * Test de l'objet, on test que l'instanciation s'est bien deroule
	 */
	@Test
	public void testStation() {
		assertNotNull("L'instance est creee", s);
		assertNotNull("L'instance est creee", s1);
	}

	/**
	 * Test methode GetIdStation
	 */
	@Test
	public void testGetIdStation() {
		assertEquals("L'id Station est t'il bon", 1, s.getIdStation());
	}

	/**
	 * Test methode GetIdStation en cas de faux
	 */
	@Test
	public void testGetIdStationInverse() {
		assertNotEquals("L'id Station est t'il mauvais", 2, s.getIdStation());
	}

	/**
	 * Test methode GetlesBornes
	 */
	@Test
	public void testGetLesBornes() {
		List<Borne> bornes = new ArrayList<Borne>();
		bornes.add(b1);
		bornes.add(b2);
		bornes.add(b3);
		bornes.add(b4);
		assertEquals("Les bornes sont t'elles exact", bornes, s.getLesBornes());
		List<Borne> bs = new ArrayList<Borne>();
		bs.add(b2);
		bs.add(b3);
		bs.add(b4);
		assertEquals("Les bornes sont t'elles exact", bs, s1.getLesBornes());
	}

	/**
	 * Test methode GetlesBornes
	 */
	@Test
	public void testGetLesBornesInverse() {
		List<Borne> bornes = new ArrayList<Borne>();
		bornes.add(b1);
		bornes.add(b2);
		assertNotEquals("Les bornes ne sont t'elles pas exact", bornes,
				s.getLesBornes());
	}

	/**
	 * Test methode SetLesBornes
	 */
	@Test
	public void testSetLesBornes() {
		List<Borne> bornes = new ArrayList<Borne>();
		bornes.add(b2);
		bornes.add(b3);
		bornes.add(b3);
		bornes.add(b4);
		s.setLesBornes(bornes);
		assertEquals("Les bornes sont t'elles exact", bornes, s.getLesBornes());
		s1.setLesBornes(bornes);
		assertEquals("Les bornes sont t'elles exact", bornes, s1.getLesBornes());
	}

	/**
	 * Test methode SetLesBornes en cas de faux
	 */
	@Test
	public void testSetLesBornesInverse() {
		List<Borne> bornes = new ArrayList<Borne>();
		bornes.add(b1);
		bornes.add(b4);
		bornes.add(b3);
		bornes.add(b4);
		assertNotEquals("Les bornes sont t'elles fausses", bornes,
				s.getLesBornes());
	}

	/**
	 * Test methode GetLibelleEmplacement
	 */
	@Test
	public void testGetLibelleEmplacement() {
		assertEquals("Le libelle est t'il bon", "Gare du nord",
				s.getLibelleEmplacement());
		assertEquals("Le libelle est t'il bon", "Gare de l'est",
				s1.getLibelleEmplacement());
	}

	/**
	 * Test methode GetLibelleEmplacement en cas de faux
	 */
	@Test
	public void testGetLibelleEmplacementInverse() {
		assertNotEquals("Le libelle est t'il faux", "Gare du sud",
				s.getLibelleEmplacement());
	}

	/**
	 * Test SetLibelleEmplacement
	 */
	@Test
	public void testSetLibelleEmplacement() {
		s.setLibelleEmplacement("Gare de l'est");
		assertEquals("Le libelle emplacement est-il bon", "Gare de l'est",
				s.getLibelleEmplacement());
		s1.setLibelleEmplacement("Gare de l'ouest");
		assertEquals("Le libelle emplacement est-il bon", "Gare de l'ouest",
				s1.getLibelleEmplacement());
	}

	/**
	 * Test SetLibelleEmplacement en cas de faux
	 */
	@Test
	public void testSetLibelleEmplacementInverse() {
		assertNotEquals("Le libelle emplacement est-il faux", "Gare de l'est",
				s.getLibelleEmplacement());
	}

	/**
	 * Test methode GetNbBorne
	 */
	@Test
	public void testGetNbBorne() {
		List<Borne> bornes = new ArrayList<Borne>();
		bornes.add(b1);
		bornes.add(b2);
		s.setLesBornes(bornes);
		assertEquals("Le nombre de bornes est-il exact", 2, s.GetNbBorne());
		s1.setLesBornes(bornes);
		assertEquals("Le nombre de bornes est-il exact", 2, s1.GetNbBorne());
	}

	/**
	 * Test methode GetNbBorne en cas de faux
	 */
	@Test
	public void testGetNbBorneInverse() {
		List<Borne> bornes = new ArrayList<Borne>();
		bornes.add(b1);
		bornes.add(b2);
		bornes.add(b3);
		s.setLesBornes(bornes);
		assertNotEquals("Le nombre de bornes est-il faux", 2, s.GetNbBorne());
	}

	/**
	 * Test methode AjoutBorne
	 */
	@Test
	public void testAjoutBorne() {
		s.ajoutBorne(b1);
		assertEquals("La borne ajoute est-t'elle exact", b1, s.getLesBornes().get(0));
		s1.ajoutBorne(b1);
		assertEquals("La borne ajoute est-t'elle exact", b1, s1.getLesBornes().get(3));
	}
	/**
	 * Test methode AjoutBorne en cas de faux
	 */
	@Test
	public void testAjoutBorneInverse() {
		s.ajoutBorne(b1);
		s.ajoutBorne(b2);
		assertNotEquals("La borne n'a t'elle pas ete ajoute", b1, s.getLesBornes().get(1));
	}
}
